home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / QuickTime VR / MacOS / QuickDraw™ 3D 1.0.6F4 SDK / Samples / SampleCode / VCDemo / Source / EventLoop.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-13  |  8.5 KB  |  353 lines  |  [TEXT/MPS ]

  1. /*
  2.     EventLoop.c
  3.  
  4.     Handle events.
  5.  
  6.     © 1995 Apple Computer, Inc.
  7. */
  8.  
  9. #include <QuickDraw.h>
  10. #include <Events.h>
  11. #include <Windows.h>
  12. #include <Desk.h>
  13. #include <Controls.h>
  14. #include <Menus.h>
  15. #include <ToolUtils.h>
  16. #include <SegLoad.h>
  17.  
  18. #include "EventLoop.h"
  19. #include "MenuDispatch.h"
  20. #include "QD3DViewer.h"
  21.  
  22. Boolean        Done = false;                /* true when Quit is selected */
  23. Boolean        KeyPressed = false;            /* true most recent event is a keyDown event */
  24. char        KeyValue = 0;                /* the ascii code of the most recent key down */
  25.  
  26. Boolean        WNE_available = false;        /* Does WNE exist on this mac?? */
  27. Boolean        BackgroundFlag = false;        /* true if we are in the background */
  28.  
  29. void DoCloseWindow(register EventRecord *evt, register WindowPtr theWindow);
  30. void DoClickInContent(register EventRecord *evt, register WindowPtr theWindow);
  31. void DoDragWindow(register EventRecord *evt, register WindowPtr theWindow);
  32. void DoGrowWindow(register EventRecord *evt, register WindowPtr theWindow);
  33. void DoZoom(register EventRecord *evt, register WindowPtr theWindow, int part);
  34. void DoMenu(register long msel);
  35. void DoKey(register EventRecord *evt);
  36. void DrawClippedGrowIcon(WindowPtr theWindow);
  37. void DoUpdate(register EventRecord *evt);
  38. void ActivateWindow(register WindowRecord    *newFrontWindow);
  39. void DeactivateWindow(register WindowRecord    *newBehindWindow);
  40. void DoActivate(register EventRecord *evt);
  41. void DoMFinder(register EventRecord *evt);
  42. void DoClick(register EventRecord *evt);
  43. void MainEvent(void);
  44.  
  45. extern void MenuDispatch(short menuNumber,short itemNumber);
  46. extern void DrawImage(GrafPtr graf);
  47. extern void AdjustMenuItems(void);
  48. extern void ChooseFile(short item);
  49.  
  50. extern WindowPtr        MainView;
  51.  
  52. void DoCloseWindow(register EventRecord *evt, register WindowPtr theWindow)
  53. {
  54.     if(TrackGoAway(theWindow,evt->where)) {
  55.         ChooseFile(cmdClose);
  56.     }
  57. }
  58.  
  59. void DoClickInContent(register EventRecord *evt, register WindowPtr theWindow)
  60. {
  61.     int                part;
  62.     ControlHandle    ctlh;
  63.     Point            pt;
  64.     GrafPtr            saveport;
  65.     Rect            frame;
  66.     
  67.     if(theWindow != FrontWindow())
  68.     {
  69.         SelectWindow(theWindow);
  70.         MainView = theWindow;
  71.     }
  72.     else
  73.     {
  74.         GetPort(&saveport);
  75.         SetPort(theWindow);
  76.         pt = evt->where;
  77.         GlobalToLocal(&pt);
  78.         if ((part = FindControl(pt, theWindow, &ctlh)) != kControlNoPart) {
  79.             /* TrackControl Goes Here */
  80.         }
  81.         SetPort(saveport);
  82.     }
  83. }
  84.  
  85.  
  86. void DoDragWindow(register EventRecord *evt, register WindowPtr theWindow)
  87. {
  88.     DragWindow(theWindow,evt->where,&qd.screenBits.bounds);
  89. }
  90.  
  91.  
  92. void DoGrowWindow(register EventRecord *evt, register WindowPtr theWindow)
  93. {
  94.     long    newSize;
  95.     int        newHeight,newWidth;
  96.     Rect    growLimitSizes;
  97.     OSErr    anErr;
  98.  
  99.     SetPort(theWindow);
  100.  
  101.     growLimitSizes.top = 20;        /* min height */
  102.     growLimitSizes.bottom = 400;    /* max height */
  103.     growLimitSizes.left = 20;         /* min width */
  104.     growLimitSizes.right = 600;        /* max width */
  105.  
  106.     newSize = GrowWindow(theWindow,evt->where, &growLimitSizes);
  107.     if (newSize)
  108.     {
  109.         newHeight = HiWord(newSize);
  110.         newWidth = LoWord(newSize);
  111.         SizeWindow(theWindow, newWidth, newHeight, true);
  112.         InvalRect(&theWindow->portRect);
  113.         if (theWindow == MainView)
  114.         {
  115.             TVCDemoDataHdl    demoData;
  116.             TQ3ViewerObject    aViewer;
  117.  
  118.             demoData = (TVCDemoDataHdl)GetWRefCon(MainView);
  119.             aViewer = (*demoData)->viewer1;
  120.             anErr = Q3ViewerSetBounds(aViewer, &theWindow->portRect);
  121.         }
  122.     }
  123. }
  124.  
  125. void DoZoom(register EventRecord *evt, register WindowPtr theWindow, int part)
  126. {
  127.     GrafPtr savePort;
  128.     OSErr    anErr;
  129.     
  130.     GetPort(&savePort);
  131.     SetPort(theWindow);
  132.     
  133.     if(TrackBox(theWindow,evt->where,part)) {
  134.         ZoomWindow(theWindow,part,true);
  135.         if (theWindow == MainView)
  136.         {
  137.             Rect            newRect;
  138.             TQ3ViewerObject    aViewer;
  139.             TVCDemoDataHdl    demoData;
  140.     
  141.             demoData = (TVCDemoDataHdl)GetWRefCon(MainView);
  142.             aViewer = (*demoData)->viewer1;
  143.  
  144.             newRect = theWindow->portRect;
  145.             anErr = Q3ViewerSetBounds(aViewer, &newRect);
  146.         }
  147.     }
  148.     SetPort(savePort);
  149. }
  150.  
  151. void DoMenu(register long msel)
  152. {
  153.     int item,menu;
  154.  
  155.     item = LoWord(msel);
  156.     menu = HiWord(msel);
  157.     MenuDispatch(menu, item);
  158.     HiliteMenu(0);
  159. }
  160.  
  161. void DoKey(register EventRecord *evt)
  162. {
  163.     char        c;
  164.     
  165.     c = (char)evt->message & charCodeMask;
  166.     
  167.     if((evt->modifiers & cmdKey) == false) {
  168.         KeyPressed = true;
  169.         KeyValue = c;
  170.     } else {
  171.         AdjustMenuItems();
  172.         DoMenu(MenuKey(evt->message & charCodeMask));    
  173.     }
  174. }
  175.  
  176. void DrawClippedGrowIcon(WindowPtr theWindow)
  177. /*
  178.     Clip out the lines that appear
  179.     on the sides of a window with a grow icon.
  180. */
  181. {
  182.     Rect        clip;
  183.     RgnHandle    oldClip;
  184.     
  185.     oldClip = NewRgn();
  186.     GetClip(oldClip);
  187.     clip = theWindow->portRect;
  188.     clip.left = clip.right - 15;
  189.     clip.top = clip.bottom - 15;
  190.  
  191.     ClipRect(&clip);
  192.     
  193.     DrawGrowIcon(theWindow);
  194.     SetClip(oldClip);
  195. }
  196.  
  197. void DoUpdate(register EventRecord *evt)
  198. {
  199.     WindowPtr        updateWindow;
  200.     GrafPtr            savePort;
  201.     TQ3ViewerObject    aViewer;
  202.     TVCDemoDataHdl    demoData;
  203.  
  204.     GetPort(&savePort);                        /* save current port */
  205.     
  206.     updateWindow=(WindowPtr)evt->message;    /* get windowPtr from event msg */
  207.     SetPort(updateWindow);
  208.     BeginUpdate(updateWindow);                        
  209.     EraseRect(&updateWindow->portRect);        /* erase content region */
  210.  
  211.     demoData = (TVCDemoDataHdl)GetWRefCon(updateWindow);
  212.     aViewer = (*demoData)->viewer1;
  213.     if (Q3ViewerDraw(aViewer) != 0)            /* Draw the view controller contents */
  214.         ExitToShell();
  215.         
  216.     if ((*demoData)->containerStyle == kContainerFourView)
  217.     {
  218.         aViewer = (*demoData)->viewer2;
  219.         Q3ViewerDraw(aViewer);                /* Draw the view controller contents */
  220.         aViewer = (*demoData)->viewer3;
  221.         Q3ViewerDraw(aViewer);                /* Draw the view controller contents */
  222.         aViewer = (*demoData)->viewer4;
  223.         Q3ViewerDraw(aViewer);                /* Draw the view controller contents */
  224.     }
  225.     
  226.     DrawControls(updateWindow);                /* draw any controls in the window */
  227.     DrawClippedGrowIcon(updateWindow);
  228.     EndUpdate(updateWindow);
  229.         
  230.     SetPort(savePort);
  231. }
  232.  
  233.  
  234. void ActivateWindow(register WindowRecord    *newFrontWindow)
  235. {
  236.     /* This window is now active.  Controls should be enabled, etc. */
  237. }
  238.  
  239. void DeactivateWindow(register WindowRecord    *newBehindWindow)
  240. {
  241.     /* 
  242.         do anyting necessary to deactivate your windows here.
  243.         controls should be dimmed, etc.
  244.     */
  245. }
  246.  
  247. void DoActivate(register EventRecord *evt)
  248. {
  249.     if(evt->modifiers & activeFlag)
  250.         ActivateWindow((WindowRecord *)evt->message);
  251.     else
  252.         DeactivateWindow((WindowRecord *)evt->message);
  253. }
  254.  
  255. void DoMFinder(register EventRecord *evt)
  256. {
  257.     if( (evt->message >> 24) == suspendResumeMessage)
  258.         BackgroundFlag = !(evt->message & resumeFlag);
  259. }
  260.  
  261. void DoClick(register EventRecord *evt)
  262. {
  263.     WindowPtr    theWindow;
  264.     
  265.     switch(FindWindow(evt->where, &theWindow)) {
  266.         case inDesk:        break;
  267.         case inMenuBar:        AdjustMenuItems();
  268.                             DoMenu(MenuSelect(evt->where));
  269.                             break;
  270.         case inSysWindow:    SystemClick(evt,theWindow);
  271.                             break;
  272.         case inContent:        DoClickInContent(evt,theWindow);
  273.                             break;
  274.         case inDrag:        DoDragWindow(evt,theWindow);
  275.                             break;
  276.         case inGrow:        DoGrowWindow(evt,theWindow);
  277.                             break;
  278.         case inGoAway:        DoCloseWindow(evt,theWindow);
  279.                             break;
  280.         case inZoomIn:        DoZoom(evt,theWindow,inZoomIn);
  281.                             break;
  282.         case inZoomOut:        DoZoom(evt,theWindow,inZoomOut);
  283.                             break;
  284.         default:            break;
  285.     }
  286. }
  287.  
  288.  
  289. void MainEvent(void)
  290. {
  291.     EventRecord    event;
  292.     Boolean        eventOccured, wasQ3Event;
  293.     Point        localPt;
  294.     TQ3ViewerObject    aViewer = NULL;
  295.     
  296.     KeyPressed = false;                /* set to false every time through    */
  297.     if (WNE_available)
  298.         eventOccured = WaitNextEvent(everyEvent,&event,10,nil);
  299.     else {
  300.         SystemTask();
  301.         eventOccured = GetNextEvent(everyEvent, &event);
  302.     }
  303.     if (eventOccured)
  304.     {
  305.         wasQ3Event = false;
  306.         if (MainView && (event.what != updateEvt))
  307.         {
  308.             TVCDemoDataHdl    demoData;
  309.     
  310.             demoData = (TVCDemoDataHdl)GetWRefCon(MainView);
  311.             aViewer = (*demoData)->viewer1;
  312.             SetPort(MainView);                /* just to make sure */
  313.             GetMouse(&localPt);
  314.             if (!Q3ViewerAdjustCursor(aViewer, &localPt))
  315.                 InitCursor();
  316.             wasQ3Event = Q3ViewerEvent(aViewer, &event);
  317.             if (((*demoData)->containerStyle == kContainerFourView) && !wasQ3Event)
  318.             {
  319.                 aViewer = (*demoData)->viewer2;
  320.                 wasQ3Event = Q3ViewerEvent(aViewer, &event);
  321.  
  322.                 if (!wasQ3Event)
  323.                 {
  324.                     aViewer = (*demoData)->viewer3;
  325.                     wasQ3Event = Q3ViewerEvent(aViewer, &event);
  326.                     if (!wasQ3Event)
  327.                     {
  328.                         aViewer = (*demoData)->viewer4;
  329.                         wasQ3Event = Q3ViewerEvent(aViewer, &event);
  330.                     }
  331.                 }
  332.             }
  333.         }
  334.         if (!wasQ3Event)
  335.             switch(event.what)
  336.             {
  337.                 case nullEvent:                                break;
  338.                 case mouseDown:        DoClick(&event);        break;
  339.                 case mouseUp:                                 break;
  340.                 case keyDown:        DoKey(&event);            break;
  341.                 case keyUp:                                     break;
  342.                 case autoKey:        DoKey(&event);            break;
  343.                 case updateEvt:        DoUpdate(&event);        break;
  344.                 case diskEvt:                                 break;
  345.                 case activateEvt:    DoActivate(&event);        break;
  346.                 case osEvt:            DoMFinder(&event);        break;
  347.                 default:                                    break;
  348.             }
  349.     }
  350. }
  351.  
  352. /* EOF */
  353.